In [5]:
import librosa
import random
import itertools
import numpy as np
import pandas as pd
import os
from numpy import mean
from numpy import std
from numpy import dstack, stack, vstack, hstack
from pandas import read_csv
import matplotlib.pyplot as plt
from scipy import signal
from scipy.signal import find_peaks
from os.path import join
from scipy.fft import fft, ifft, fftfreq, fftshift
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, classification_report, ConfusionMatrixDisplay, f1_score
from sklearn.preprocessing import MinMaxScaler, RobustScaler
from sklearn import preprocessing
import tensorflow as tf
from tensorflow.keras import Sequential,Input, layers
from tensorflow.keras.layers import Input, Dense, Dropout, Flatten, GlobalMaxPool1D, LSTM, Embedding, MaxPool1D
from tensorflow.keras.models import load_model, Model
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.utils import to_categorical
from keras.utils.vis_utils import plot_model
from keras.layers.convolutional import Conv1D
from keras.layers.convolutional import MaxPooling1D
from keras.layers import concatenate

from mpl_toolkits.mplot3d.axes3d import Axes3D
from mpl_toolkits.mplot3d import proj3d

frame_length = 128
hop_length = 16
split_sec = 10
In [8]:
file_path = 'data/'
file_list = os.listdir(file_path)
In [9]:
file_list
Out[9]:
['fast_incline.csv',
 'fast_decline.csv',
 '221108',
 'fast_gravelly.csv',
 '221107',
 '221105',
 'fast_even.csv',
 'slow_even.csv']
In [10]:
# data import
fast_incline = read_csv(file_path + file_list[0], header=None)
fast_decline = read_csv(file_path + file_list[1], header=None)
fast_gravelly = read_csv(file_path + file_list[3], header=None)
fast_even = read_csv(file_path + file_list[6], header=None)
slow_even = read_csv(file_path + file_list[7], header=None)
In [11]:
print(
    fast_even.shape,
    slow_even.shape,
    fast_incline.shape,
    fast_decline.shape,
    fast_gravelly.shape
)
(105174, 7) (88672, 7) (103681, 7) (92226, 7) (101921, 7)
In [12]:
file_list
Out[12]:
['fast_incline.csv',
 'fast_decline.csv',
 '221108',
 'fast_gravelly.csv',
 '221107',
 '221105',
 'fast_even.csv',
 'slow_even.csv']
In [13]:
# trans = RobustScaler()

terrain = fast_even

raw_data = terrain[1].tolist()[:-1280*split_sec]
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].tolist()[:-1280*split_sec]
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].tolist()[:-1280*split_sec]
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].tolist()[:-1280*split_sec]
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].tolist()[:-1280*split_sec]
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].tolist()[:-1280*split_sec]
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_fast_even = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_fast_even.shape)

#---------------------------------------------------------------------------------------------------------------#
raw_data = terrain[1].tolist()[-1280*split_sec:]
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].tolist()[-1280*split_sec:]
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].tolist()[-1280*split_sec:]
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].tolist()[-1280*split_sec:]
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].tolist()[-1280*split_sec:]
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].tolist()[-1280*split_sec:]
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_fast_even_test = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_fast_even_test.shape)
(5766, 128, 6)
(793, 128, 6)
In [14]:
f, axes = plt.subplots(2, 3)

# 격자 크기 설정
f.set_size_inches((20, 15))

# 격자 여백 설정
plt.subplots_adjust(wspace = 0.1, hspace = 0.1)

data = frames_1
for i in range(10):
    axes[0,0].plot(data[i])
    
data = frames_2
for i in range(10):
    axes[0, 1].plot(data[i])
    
data = frames_3
for i in range(10):
    axes[0, 2].plot(data[i])
    
data = frames_4
for i in range(10):
    axes[1, 0].plot(data[i])
    
data = frames_5
for i in range(10):
    axes[1, 1].plot(data[i])
    
data = frames_6
for i in range(10):
    axes[1, 2].plot(data[i])

plt.show()
In [15]:
plt.figure(figsize=(6,4))
x = np.arange(1280)/1280
plt.plot(x, terrain[1][-1280:], label='leg1')
plt.plot(x,terrain[2][-1280:], label='leg2')
plt.plot(x, terrain[3][-1280:], label='leg3')
plt.plot(x, terrain[4][-1280:], label='leg4')
plt.plot(x, terrain[5][-1280:], label='leg5')
plt.plot(x, terrain[6][-1280:], label='leg6')
plt.xlabel('time(s)')
plt.ylabel('Normalized amplitude')
plt.title('fast even 1sec')

plt.ylim(-0.2, 5.3)
plt.legend(loc='upper right')
plt.savefig('saved_images/220414/fast_even_1sec_2D.svg', dpi='figure', format='svg')
In [16]:
f, axes = plt.subplots(6, 1)

# 격자 크기 설정
f.set_size_inches((5, 5))

# 격자 여백 설정
plt.subplots_adjust(wspace = 0.5, hspace = 0.5)

x = np.arange(540)/540

axes[0].plot(x, terrain[1][-540:].to_numpy(), label='leg1', color='red')
axes[0].set_ylim(0,3.5)

axes[1].plot(x, terrain[2][-540:].to_numpy(), label='leg2', color='gold')
axes[1].set_ylim(0,3.5)

axes[2].plot(x, terrain[3][-540:].to_numpy(), label='leg3', color='green')
axes[2].set_ylim(0,3.5)

axes[3].plot(x, terrain[4][-540:].to_numpy(), label='leg4', color='skyblue')
axes[3].set_ylim(0,3.5)

axes[4].plot(x, terrain[5][-540:].to_numpy(), label='leg5', color='blue')
axes[4].set_ylim(0,3.5)

axes[5].plot(x, terrain[6][-540:].to_numpy(), label='leg6', color='purple')
axes[5].set_ylim(0,3.5)

axes[0].set_title('fast_even_0.5sec')

plt.savefig('saved_images/220418/6_col_0.5sec_fast_even.svg', dpi='figure', format='svg')

plt.show()
In [17]:
z1 = terrain[1][:1280]
x1 = np.arange(0, len(z1))/1280
y1 = np.full((len(z1),), 1)

z2 = terrain[2][:1280]
x2 = np.arange(0, len(z2))/1280
y2 = np.full((len(z2),), 2)

z3 = terrain[3][:1280]
x3 = np.arange(0, len(z3))/1280
y3 = np.full((len(z3),), 3)

z4 = terrain[4][:1280]
x4 = np.arange(0, len(z4))/1280
y4 = np.full((len(z4),), 4)

z5 = terrain[5][:1280]
x5 = np.arange(0, len(z5))/1280
y5 = np.full((len(z5),), 5)

z6 = terrain[6][:1280]
x6 = np.arange(0, len(z6))/1280
y6 = np.full((len(z6),), 6)
In [18]:
fig = plt.figure(figsize = (8, 8))
ax = fig.gca(projection='3d')

ax.plot(x1, y1, z1)
ax.plot(x2, y2, z2)
ax.plot(x3, y3, z3)
ax.plot(x4, y4, z4)
ax.plot(x5, y5, z5)
ax.plot(x6, y6, z6)
ax.set_xlabel('Time')
ax.set_ylabel('Leg number')
ax.set_zlabel('Normalized Resistance')
ax.view_init(elev=75, azim=-80)

x_scale = 1
y_scale = 1
z_scale = 1

scale=np.diag([x_scale, y_scale, z_scale, 1.0])
scale=scale*(1.0/scale.max())
scale[3,3]=1.0

def short_proj():
    return np.dot(Axes3D.get_proj(ax), scale)

ax.get_proj=short_proj

plt.savefig('saved_images/220414/6legged_signals_3D_plots_fast_even.svg', dpi='figure', format='svg')
<ipython-input-18-759d97c78970>:2: MatplotlibDeprecationWarning: Calling gca() with keyword arguments was deprecated in Matplotlib 3.4. Starting two minor releases later, gca() will take no keyword arguments. The gca() function should only be used to get the current axes, or if no axes exist, create new axes with default keyword arguments. To create a new axes with non-default arguments, use plt.axes() or plt.subplot().
  ax = fig.gca(projection='3d')
In [19]:
# trans = RobustScaler()

terrain = slow_even

raw_data = terrain[1].tolist()[:-1280*split_sec]
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].tolist()[:-1280*split_sec]
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].tolist()[:-1280*split_sec]
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].tolist()[:-1280*split_sec]
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].tolist()[:-1280*split_sec]
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].tolist()[:-1280*split_sec]
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_slow_even = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_slow_even.shape)

#---------------------------------------------------------------------------------------------------------------#
raw_data = terrain[1].tolist()[-1280*split_sec:]
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].tolist()[-1280*split_sec:]
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].tolist()[-1280*split_sec:]
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].tolist()[-1280*split_sec:]
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].tolist()[-1280*split_sec:]
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].tolist()[-1280*split_sec:]
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_slow_even_test = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_slow_even_test.shape)
(4735, 128, 6)
(793, 128, 6)
In [20]:
f, axes = plt.subplots(2, 3)

# 격자 크기 설정
f.set_size_inches((20, 15))

# 격자 여백 설정
plt.subplots_adjust(wspace = 0.1, hspace = 0.1)

data = frames_1
for i in range(10):
    axes[0,0].plot(data[i])
    
data = frames_2
for i in range(10):
    axes[0, 1].plot(data[i])
    
data = frames_3
for i in range(10):
    axes[0, 2].plot(data[i])
    
data = frames_4
for i in range(10):
    axes[1, 0].plot(data[i])
    
data = frames_5
for i in range(10):
    axes[1, 1].plot(data[i])
    
data = frames_6
for i in range(10):
    axes[1, 2].plot(data[i])

plt.show()
In [21]:
plt.figure(figsize=(6,4))
x = np.arange(1280)/1280
plt.plot(x, terrain[1][-1280:], label='leg1')
plt.plot(x,terrain[2][-1280:], label='leg2')
plt.plot(x, terrain[3][-1280:], label='leg3')
plt.plot(x, terrain[4][-1280:], label='leg4')
plt.plot(x, terrain[5][-1280:], label='leg5')
plt.plot(x, terrain[6][-1280:], label='leg6')
plt.xlabel('time(s)')
plt.ylabel('Normalized amplitude')
plt.title('slow even 1sec')

plt.ylim(-0.2, 5.3)
plt.legend(loc='upper right')
plt.savefig('saved_images/220414/slow_even_1sec_2D.svg', dpi='figure', format='svg')
In [22]:
f, axes = plt.subplots(6, 1)

# 격자 크기 설정
f.set_size_inches((5, 5))

# 격자 여백 설정
plt.subplots_adjust(wspace = 0.5, hspace = 0.5)

x = np.arange(540)/540

axes[0].plot(x, terrain[1][-540*2:-540].to_numpy(), label='leg1', color='red')
axes[0].set_ylim(0,3.5)

axes[1].plot(x, terrain[2][-540*2:-540].to_numpy(), label='leg2', color='gold')
axes[1].set_ylim(0,3.5)

axes[2].plot(x, terrain[3][-540*2:-540].to_numpy(), label='leg3', color='green')
axes[2].set_ylim(0,3.5)

axes[3].plot(x, terrain[4][-540*2:-540].to_numpy(), label='leg4', color='skyblue')
axes[3].set_ylim(0,3.5)

axes[4].plot(x, terrain[5][-540*2:-540].to_numpy(), label='leg5', color='blue')
axes[4].set_ylim(0,3.5)

axes[5].plot(x, terrain[6][-540*2:-540].to_numpy(), label='leg6', color='purple')
axes[5].set_ylim(0,3.5)

axes[0].set_title('fast_slow_0.5sec')

plt.savefig('saved_images/220418/6_col_0.5sec_slow_even.svg', dpi='figure', format='svg')

plt.show()
In [23]:
z1 = terrain[1][:1280]
x1 = np.arange(0, len(z1))/1280
y1 = np.full((len(z1),), 1)

z2 = terrain[2][:1280]
x2 = np.arange(0, len(z2))/1280
y2 = np.full((len(z2),), 2)

z3 = terrain[3][:1280]
x3 = np.arange(0, len(z3))/1280
y3 = np.full((len(z3),), 3)

z4 = terrain[4][:1280]
x4 = np.arange(0, len(z4))/1280
y4 = np.full((len(z4),), 4)

z5 = terrain[5][:1280]
x5 = np.arange(0, len(z5))/1280
y5 = np.full((len(z5),), 5)

z6 = terrain[6][:1280]
x6 = np.arange(0, len(z6))/1280
y6 = np.full((len(z6),), 6)
In [24]:
fig = plt.figure(figsize = (8, 8))
ax = fig.gca(projection='3d')

ax.plot(x1, y1, z1)
ax.plot(x2, y2, z2)
ax.plot(x3, y3, z3)
ax.plot(x4, y4, z4)
ax.plot(x5, y5, z5)
ax.plot(x6, y6, z6)
ax.set_xlabel('Time')
ax.set_ylabel('Leg number')
ax.set_zlabel('Normalized Resistance')
ax.view_init(elev=75, azim=-80)

x_scale = 1
y_scale = 1
z_scale = 1

scale=np.diag([x_scale, y_scale, z_scale, 1.0])
scale=scale*(1.0/scale.max())
scale[3,3]=1.0

def short_proj():
    return np.dot(Axes3D.get_proj(ax), scale)

ax.get_proj=short_proj
plt.savefig('saved_images/220414/6legged_signals_3D_plots_slow_even.svg', dpi='figure', format='svg')
<ipython-input-24-c2d7ebb351bb>:2: MatplotlibDeprecationWarning: Calling gca() with keyword arguments was deprecated in Matplotlib 3.4. Starting two minor releases later, gca() will take no keyword arguments. The gca() function should only be used to get the current axes, or if no axes exist, create new axes with default keyword arguments. To create a new axes with non-default arguments, use plt.axes() or plt.subplot().
  ax = fig.gca(projection='3d')
In [25]:
# trans = RobustScaler()

terrain = fast_incline

raw_data = terrain[1].tolist()[:-1280*split_sec]
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].tolist()[:-1280*split_sec]
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].tolist()[:-1280*split_sec]
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].tolist()[:-1280*split_sec]
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].tolist()[:-1280*split_sec]
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].tolist()[:-1280*split_sec]
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_fast_incline = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_fast_incline.shape)

#---------------------------------------------------------------------------------------------------------------#
raw_data = terrain[1].tolist()[-1280*split_sec:]
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].tolist()[-1280*split_sec:]
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].tolist()[-1280*split_sec:]
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].tolist()[-1280*split_sec:]
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].tolist()[-1280*split_sec:]
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].tolist()[-1280*split_sec:]
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_fast_incline_test = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_fast_incline_test.shape)
(5673, 128, 6)
(793, 128, 6)
In [26]:
f, axes = plt.subplots(2, 3)

# 격자 크기 설정
f.set_size_inches((20, 15))

# 격자 여백 설정
plt.subplots_adjust(wspace = 0.1, hspace = 0.1)

data = frames_1
for i in range(10):
    axes[0,0].plot(data[i])
    
data = frames_2
for i in range(10):
    axes[0, 1].plot(data[i])
    
data = frames_3
for i in range(10):
    axes[0, 2].plot(data[i])
    
data = frames_4
for i in range(10):
    axes[1, 0].plot(data[i])
    
data = frames_5
for i in range(10):
    axes[1, 1].plot(data[i])
    
data = frames_6
for i in range(10):
    axes[1, 2].plot(data[i])

plt.show()
In [27]:
plt.figure(figsize=(6,4))
x = np.arange(1280)/1280
plt.plot(x, terrain[1][-1280:], label='leg1')
plt.plot(x,terrain[2][-1280:], label='leg2')
plt.plot(x, terrain[3][-1280:], label='leg3')
plt.plot(x, terrain[4][-1280:], label='leg4')
plt.plot(x, terrain[5][-1280:], label='leg5')
plt.plot(x, terrain[6][-1280:], label='leg6')
plt.xlabel('time(s)')
plt.ylabel('Normalized amplitude')
plt.title('fast incline 1sec')

plt.ylim(-0.2, 5.3)
plt.legend(loc='upper right')

plt.savefig('saved_images/220414/fast_incline_1sec_2D.svg', dpi='figure', format='svg')
In [28]:
f, axes = plt.subplots(6, 1)

# 격자 크기 설정
f.set_size_inches((5, 5))

# 격자 여백 설정
plt.subplots_adjust(wspace = 0.5, hspace = 0.5)

x = np.arange(540)/540

axes[0].plot(x, terrain[1][-540:].to_numpy(), label='leg1', color='red')
axes[0].set_ylim(0,3.5)

axes[1].plot(x, terrain[2][-540:].to_numpy(), label='leg2', color='gold')
axes[1].set_ylim(0,3.5)

axes[2].plot(x, terrain[3][-540:].to_numpy(), label='leg3', color='green')
axes[2].set_ylim(0,3.5)

axes[3].plot(x, terrain[4][-540:].to_numpy(), label='leg4', color='skyblue')
axes[3].set_ylim(0,3.5)

axes[4].plot(x, terrain[5][-540:].to_numpy(), label='leg5', color='blue')
axes[4].set_ylim(0,3.5)

axes[5].plot(x, terrain[6][-540:].to_numpy(), label='leg6', color='purple')
axes[5].set_ylim(0,3.5)

axes[0].set_title('fast_incline_0.5sec')

plt.savefig('saved_images/220418/6_col_0.5sec_fast_incline.svg', dpi='figure', format='svg')

plt.show()
In [29]:
z1 = terrain[1][:1280]
x1 = np.arange(0, len(z1))/1280
y1 = np.full((len(z1),), 1)

z2 = terrain[2][:1280]
x2 = np.arange(0, len(z2))/1280
y2 = np.full((len(z2),), 2)

z3 = terrain[3][:1280]
x3 = np.arange(0, len(z3))/1280
y3 = np.full((len(z3),), 3)

z4 = terrain[4][:1280]
x4 = np.arange(0, len(z4))/1280
y4 = np.full((len(z4),), 4)

z5 = terrain[5][:1280]
x5 = np.arange(0, len(z5))/1280
y5 = np.full((len(z5),), 5)

z6 = terrain[6][:1280]
x6 = np.arange(0, len(z6))/1280
y6 = np.full((len(z6),), 6)
In [30]:
fig = plt.figure(figsize = (8, 8))
ax = fig.gca(projection='3d')

ax.plot(x1, y1, z1)
ax.plot(x2, y2, z2)
ax.plot(x3, y3, z3)
ax.plot(x4, y4, z4)
ax.plot(x5, y5, z5)
ax.plot(x6, y6, z6)
ax.set_xlabel('Time')
ax.set_ylabel('Leg number')
ax.set_zlabel('Normalized Resistance')
ax.view_init(elev=75, azim=-80)

x_scale = 1
y_scale = 1
z_scale = 1

scale=np.diag([x_scale, y_scale, z_scale, 1.0])
scale=scale*(1.0/scale.max())
scale[3,3]=1.0

def short_proj():
    return np.dot(Axes3D.get_proj(ax), scale)

ax.get_proj=short_proj

plt.savefig('saved_images/220414/6legged_signals_3D_plots_fast_incline.svg', dpi='figure', format='svg')
<ipython-input-30-b7b9014afb50>:2: MatplotlibDeprecationWarning: Calling gca() with keyword arguments was deprecated in Matplotlib 3.4. Starting two minor releases later, gca() will take no keyword arguments. The gca() function should only be used to get the current axes, or if no axes exist, create new axes with default keyword arguments. To create a new axes with non-default arguments, use plt.axes() or plt.subplot().
  ax = fig.gca(projection='3d')
In [31]:
# trans = RobustScaler()

terrain = fast_decline

raw_data = terrain[1].tolist()[:-1280*split_sec]
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].tolist()[:-1280*split_sec]
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].tolist()[:-1280*split_sec]
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].tolist()[:-1280*split_sec]
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].tolist()[:-1280*split_sec]
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].tolist()[:-1280*split_sec]
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_fast_decline = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_fast_decline.shape)

#---------------------------------------------------------------------------------------------------------------#
raw_data = terrain[1].tolist()[-1280*split_sec:]
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].tolist()[-1280*split_sec:]
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].tolist()[-1280*split_sec:]
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].tolist()[-1280*split_sec:]
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].tolist()[-1280*split_sec:]
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].tolist()[-1280*split_sec:]
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_fast_decline_test = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_fast_decline_test.shape)
(4957, 128, 6)
(793, 128, 6)
In [32]:
f, axes = plt.subplots(2, 3)

# 격자 크기 설정
f.set_size_inches((20, 15))

# 격자 여백 설정
plt.subplots_adjust(wspace = 0.1, hspace = 0.1)

data = frames_1
for i in range(10):
    axes[0,0].plot(data[i])
    
data = frames_2
for i in range(10):
    axes[0, 1].plot(data[i])
    
data = frames_3
for i in range(10):
    axes[0, 2].plot(data[i])
    
data = frames_4
for i in range(10):
    axes[1, 0].plot(data[i])
    
data = frames_5
for i in range(10):
    axes[1, 1].plot(data[i])
    
data = frames_6
for i in range(10):
    axes[1, 2].plot(data[i])

plt.show()
In [33]:
plt.figure(figsize=(6,4))
x = np.arange(1280)/1280
plt.plot(x, terrain[1][-1280:], label='leg1')
plt.plot(x,terrain[2][-1280:], label='leg2')
plt.plot(x, terrain[3][-1280:], label='leg3')
plt.plot(x, terrain[4][-1280:], label='leg4')
plt.plot(x, terrain[5][-1280:], label='leg5')
plt.plot(x, terrain[6][-1280:], label='leg6')
plt.xlabel('time(s)')
plt.ylabel('Normalized amplitude')
plt.title('fast decline 1sec')

plt.ylim(-0.2, 5.3)
plt.legend(loc='upper right')

plt.savefig('saved_images/220414/fast_decline_1sec_2D.svg', dpi='figure', format='svg')
In [34]:
f, axes = plt.subplots(6, 1)

# 격자 크기 설정
f.set_size_inches((5, 5))

# 격자 여백 설정
plt.subplots_adjust(wspace = 0.5, hspace = 0.5)

x = np.arange(540)/540

axes[0].plot(x, terrain[1][-540*2:-540].to_numpy(), label='leg1', color='red')
axes[0].set_ylim(0,3.5)

axes[1].plot(x, terrain[2][-540*2:-540].to_numpy(), label='leg2', color='gold')
axes[1].set_ylim(0,3.5)

axes[2].plot(x, terrain[3][-540*2:-540].to_numpy(), label='leg3', color='green')
axes[2].set_ylim(0,3.5)

axes[3].plot(x, terrain[4][-540*2:-540].to_numpy(), label='leg4', color='skyblue')
axes[3].set_ylim(0,3.5)

axes[4].plot(x, terrain[5][-540*2:-540].to_numpy(), label='leg5', color='blue')
axes[4].set_ylim(0,3.5)

axes[5].plot(x, terrain[6][-540*2:-540].to_numpy(), label='leg6', color='purple')
axes[5].set_ylim(0,3.5)

axes[0].set_title('fast_decline_0.5sec')

plt.savefig('saved_images/220418/6_col_0.5sec_fast_decline.svg', dpi='figure', format='svg')

plt.show()
In [35]:
z1 = terrain[1][:1280]
x1 = np.arange(0, len(z1))/1280
y1 = np.full((len(z1),), 1)

z2 = terrain[2][:1280]
x2 = np.arange(0, len(z2))/1280
y2 = np.full((len(z2),), 2)

z3 = terrain[3][:1280]
x3 = np.arange(0, len(z3))/1280
y3 = np.full((len(z3),), 3)

z4 = terrain[4][:1280]
x4 = np.arange(0, len(z4))/1280
y4 = np.full((len(z4),), 4)

z5 = terrain[5][:1280]
x5 = np.arange(0, len(z5))/1280
y5 = np.full((len(z5),), 5)

z6 = terrain[6][:1280]
x6 = np.arange(0, len(z6))/1280
y6 = np.full((len(z6),), 6)
In [36]:
fig = plt.figure(figsize = (8, 8))
ax = fig.gca(projection='3d')

ax.plot(x1, y1, z1)
ax.plot(x2, y2, z2)
ax.plot(x3, y3, z3)
ax.plot(x4, y4, z4)
ax.plot(x5, y5, z5)
ax.plot(x6, y6, z6)
ax.set_xlabel('Time')
ax.set_ylabel('Leg number')
ax.set_zlabel('Normalized Resistance')
ax.view_init(elev=75, azim=-80)

x_scale = 1
y_scale = 1
z_scale = 1

scale=np.diag([x_scale, y_scale, z_scale, 1.0])
scale=scale*(1.0/scale.max())
scale[3,3]=1.0

def short_proj():
    return np.dot(Axes3D.get_proj(ax), scale)

ax.get_proj=short_proj

plt.savefig('saved_images/220414/6legged_signals_3D_plots_fast_decline.svg', dpi='figure', format='svg')
<ipython-input-36-156b34c0296d>:2: MatplotlibDeprecationWarning: Calling gca() with keyword arguments was deprecated in Matplotlib 3.4. Starting two minor releases later, gca() will take no keyword arguments. The gca() function should only be used to get the current axes, or if no axes exist, create new axes with default keyword arguments. To create a new axes with non-default arguments, use plt.axes() or plt.subplot().
  ax = fig.gca(projection='3d')
In [37]:
# trans = RobustScaler()

terrain = fast_gravelly

raw_data = terrain[1].tolist()[:-1280*2*split_sec]
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].tolist()[:-1280*2*split_sec]
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].tolist()[:-1280*2*split_sec]
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].tolist()[:-1280*2*split_sec]
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].tolist()[:-1280*2*split_sec]
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].tolist()[:-1280*2*split_sec]
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_fast_gravelly = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_fast_gravelly.shape)

#---------------------------------------------------------------------------------------------------------------#
raw_data = terrain[1].tolist()[-1280*2*split_sec:-1280*split_sec]
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].tolist()[-1280*2*split_sec:-1280*split_sec]
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].tolist()[-1280*2*split_sec:-1280*split_sec]
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].tolist()[-1280*2*split_sec:-1280*split_sec]
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].tolist()[-1280*2*split_sec:-1280*split_sec]
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].tolist()[-1280*2*split_sec:-1280*split_sec]
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_fast_gravelly_test = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_fast_gravelly_test.shape)
(4763, 128, 6)
(793, 128, 6)
In [38]:
f, axes = plt.subplots(2, 3)

# 격자 크기 설정
f.set_size_inches((20, 15))

# 격자 여백 설정
plt.subplots_adjust(wspace = 0.1, hspace = 0.1)

data = frames_1
for i in range(10):
    axes[0,0].plot(data[i])
    
data = frames_2
for i in range(10):
    axes[0, 1].plot(data[i])
    
data = frames_3
for i in range(10):
    axes[0, 2].plot(data[i])
    
data = frames_4
for i in range(10):
    axes[1, 0].plot(data[i])
    
data = frames_5
for i in range(10):
    axes[1, 1].plot(data[i])
    
data = frames_6
for i in range(10):
    axes[1, 2].plot(data[i])

plt.show()
In [39]:
plt.figure(figsize=(6,4))
x = np.arange(1280)/1280
plt.plot(x, terrain[1][-1280*2:-1280], label='leg1')
plt.plot(x,terrain[2][-1280*2:-1280], label='leg2')
plt.plot(x, terrain[3][-1280*2:-1280], label='leg3')
plt.plot(x, terrain[4][-1280*2:-1280], label='leg4')
plt.plot(x, terrain[5][-1280*2:-1280], label='leg5')
plt.plot(x, terrain[6][-1280*2:-1280], label='leg6')
plt.xlabel('time(s)')
plt.ylabel('Normalized amplitude')
plt.title('fast gravelly 1sec')

plt.ylim(-0.2, 5.3)
plt.legend(loc='upper right')

plt.savefig('saved_images/220414/fast_gravelly_1sec_2D.svg', dpi='figure', format='svg')
In [40]:
f, axes = plt.subplots(6, 1)

# 격자 크기 설정
f.set_size_inches((5, 5))

# 격자 여백 설정
plt.subplots_adjust(wspace = 0.5, hspace = 0.5)

x = np.arange(540)/540

axes[0].plot(x, terrain[1][-540*4:-540*3].to_numpy(), label='leg1', color='red')
axes[0].set_ylim(0,3.5)

axes[1].plot(x, terrain[2][-540*4:-540*3].to_numpy(), label='leg2', color='gold')
axes[1].set_ylim(0,3.5)

axes[2].plot(x, terrain[3][-540*4:-540*3].to_numpy(), label='leg3', color='green')
axes[2].set_ylim(0,3.5)

axes[3].plot(x, terrain[4][-540*4:-540*3].to_numpy(), label='leg4', color='skyblue')
axes[3].set_ylim(0,3.5)

axes[4].plot(x, terrain[5][-540*4:-540*3].to_numpy(), label='leg5', color='blue')
axes[4].set_ylim(0,3.5)

axes[5].plot(x, terrain[6][-540*4:-540*3].to_numpy(), label='leg6', color='purple')
axes[5].set_ylim(0,3.5)

axes[0].set_title('fast_gravelly_0.5sec')

plt.savefig('saved_images/220418/6_col_0.5sec_fast_gravelly.svg', dpi='figure', format='svg')

plt.show()
In [41]:
z1 = terrain[1][:1280]
x1 = np.arange(0, len(z1))/1280
y1 = np.full((len(z1),), 1)

z2 = terrain[2][:1280]
x2 = np.arange(0, len(z2))/1280
y2 = np.full((len(z2),), 2)

z3 = terrain[3][:1280]
x3 = np.arange(0, len(z3))/1280
y3 = np.full((len(z3),), 3)

z4 = terrain[4][:1280]
x4 = np.arange(0, len(z4))/1280
y4 = np.full((len(z4),), 4)

z5 = terrain[5][:1280]
x5 = np.arange(0, len(z5))/1280
y5 = np.full((len(z5),), 5)

z6 = terrain[6][:1280]
x6 = np.arange(0, len(z6))/1280
y6 = np.full((len(z6),), 6)
In [42]:
fig = plt.figure(figsize = (8, 8))
ax = fig.gca(projection='3d')

ax.plot(x1, y1, z1)
ax.plot(x2, y2, z2)
ax.plot(x3, y3, z3)
ax.plot(x4, y4, z4)
ax.plot(x5, y5, z5)
ax.plot(x6, y6, z6)
ax.set_xlabel('Time')
ax.set_ylabel('Leg number')
ax.set_zlabel('Normalized Resistance')
ax.view_init(elev=75, azim=-80)

x_scale = 1
y_scale = 1
z_scale = 1

scale=np.diag([x_scale, y_scale, z_scale, 1.0])
scale=scale*(1.0/scale.max())
scale[3,3]=1.0

def short_proj():
    return np.dot(Axes3D.get_proj(ax), scale)

ax.get_proj=short_proj

plt.savefig('saved_images/220414/6legged_signals_3D_plots_fast_gravelly.svg', dpi='figure', format='svg')
<ipython-input-42-418caf3daecf>:2: MatplotlibDeprecationWarning: Calling gca() with keyword arguments was deprecated in Matplotlib 3.4. Starting two minor releases later, gca() will take no keyword arguments. The gca() function should only be used to get the current axes, or if no axes exist, create new axes with default keyword arguments. To create a new axes with non-default arguments, use plt.axes() or plt.subplot().
  ax = fig.gca(projection='3d')
In [43]:
def label_making (x,label):
    output=[]
    
    while len(output) < len(x): 
        output.append([label])
    return (output)

# label making
y1 = label_making(stacked_fast_even,0)
y2 = label_making(stacked_slow_even,1)
y3 = label_making(stacked_fast_incline,2)
y4 = label_making(stacked_fast_decline,3)
y5 = label_making(stacked_fast_gravelly,4)

t1 = label_making(stacked_fast_even_test,0)
t2 = label_making(stacked_slow_even_test,1)
t3 = label_making(stacked_fast_incline_test,2)
t4 = label_making(stacked_fast_decline_test,3)
t5 = label_making(stacked_fast_gravelly_test,4)

# x_input = np.vstack([stacked_fast_even, stacked_slow_even, stacked_fast_incline, stacked_fast_decline, stacked_fast_gravelly])
# label_input = y1 + y2 + y3 + y4 + y5
# label_input = to_categorical(label_input)

# testX = np.vstack([stacked_fast_even_test, stacked_slow_even_test, stacked_fast_incline_test, stacked_fast_decline_test, stacked_fast_gravelly_test])
# testy = t1 + t2 + t3 + t4 + t5
# testy = to_categorical(testy)

# x_input = np.vstack([stacked_fast_even, stacked_fast_incline, stacked_fast_decline, stacked_fast_gravelly])
# label_input = y1 + y3 + y4 + y5
# label_input = to_categorical(label_input)

# testX = np.vstack([stacked_fast_even_test, stacked_fast_incline_test, stacked_fast_decline_test, stacked_fast_gravelly_test])
# testy = t1 + t3 + t4 + t5
# testy = to_categorical(testy)

x_input = np.vstack([stacked_fast_even, stacked_slow_even])
label_input = y1 + y2
label_input = to_categorical(label_input)

testX = np.vstack([stacked_fast_even_test, stacked_slow_even_test])
testy = t1 + t2
testy = to_categorical(testy)
In [44]:
print(x_input.shape,
      label_input.shape,
      testX.shape,
      testy.shape
     )
(10501, 128, 6) (10501, 2) (1586, 128, 6) (1586, 2)
In [45]:
trainX, valX, trainy, valy = train_test_split(x_input, label_input, test_size=0.33, stratify = label_input)
print( trainX.shape, valX.shape)
n_timesteps, n_features, n_outputs = trainX.shape[1], trainX.shape[2], trainy.shape[1]
(7035, 128, 6) (3466, 128, 6)
In [46]:
# fit and evaluate a model
def evaluate_model(trainX, trainy, valX, valy, testX, testy):
    
    verbose, epochs, batch_size = 0, 10, 32
    n_timesteps, n_features, n_outputs = trainX.shape[1], trainX.shape[2], trainy.shape[1]
    model = Sequential()
    model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(n_timesteps,n_features)))
    model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
    model.add(Dropout(0.5))
    model.add(MaxPooling1D(pool_size=2))
    model.add(Flatten())
    model.add(Dense(100, activation='relu'))
    model.add(Dense(n_outputs, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    
    # fit network
    hist = model.fit(trainX, trainy, epochs=epochs, batch_size=batch_size, verbose=verbose, validation_data = (valX, valy))
    # evaluate model
    loss, accuracy = model.evaluate(testX, testy, batch_size=batch_size, verbose=0)
    
    return loss, accuracy, hist
In [47]:
# loss, score, hist = evaluate_model(trainX, trainy, testX, testy)
# print(score)

loss, score, hist = evaluate_model(trainX, trainy, valX, valy, testX, testy)
print(score)
1.0
In [48]:
verbose, epochs, batch_size = 0, 50, 32
n_timesteps, n_features, n_outputs = x_input.shape[1], x_input.shape[2], label_input.shape[1]

model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(n_timesteps,n_features)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(n_outputs, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()

# fit network
hist = model.fit(trainX, trainy, epochs=epochs, batch_size=batch_size, verbose=verbose, validation_data = (valX, valy))

# model.save
model.save('saved_models/terrain_classifer_211206', overwrite=True)
Model: "sequential_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv1d_2 (Conv1D)           (None, 126, 64)           1216      
                                                                 
 conv1d_3 (Conv1D)           (None, 124, 64)           12352     
                                                                 
 dropout_1 (Dropout)         (None, 124, 64)           0         
                                                                 
 max_pooling1d_1 (MaxPooling  (None, 62, 64)           0         
 1D)                                                             
                                                                 
 flatten_1 (Flatten)         (None, 3968)              0         
                                                                 
 dense_2 (Dense)             (None, 100)               396900    
                                                                 
 dense_3 (Dense)             (None, 2)                 202       
                                                                 
=================================================================
Total params: 410,670
Trainable params: 410,670
Non-trainable params: 0
_________________________________________________________________
WARNING:absl:Found untraced functions such as _jit_compiled_convolution_op, _jit_compiled_convolution_op, _update_step_xla while saving (showing 3 of 3). These functions will not be directly callable after loading.
INFO:tensorflow:Assets written to: saved_models/terrain_classifer_211206/assets
INFO:tensorflow:Assets written to: saved_models/terrain_classifer_211206/assets
In [51]:
import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model("saved_models/terrain_classifer_211206") # path to the SavedModel directory
# converter.optimizations = [tf.lite.Optimize.DEFAULT]

tflite_model = converter.convert()

# Save the model.
with open('saved_models/terrain_classifier_211206.tflite', 'wb') as f:
    f.write(tflite_model)
In [ ]:
!xxd -i 'saved_models/terrain_classifier_211206.tflite' > 'saved_models/terrain_classifier_211206.cc'
In [216]:
# Confusion matrix
y_predict = model.predict(testX, batch_size = 32, verbose = 0)
y_predict = np.around(y_predict)
cm = confusion_matrix(testy.argmax(axis=1), y_predict.argmax(axis=1))

# Confustion matrix plotting
plt.figure(figsize=(10,8))
plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)
plt.title('confusion matrix')
plt.colorbar()
thresh = cm.max() / 2.
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
    plt.text(j, i, np.round(cm[i, j]/(np.sum(cm, 1)[i]), 2),
             horizontalalignment="center", fontdict={'fontsize': 40},
             color="white" if cm[i, j] > thresh else "black")
plt.tight_layout()
plt.ylabel('True label')
plt.xlabel('Predicted label')

# plt.savefig('saved_images/220414/confusion_matrix.svg', dpi='figure', format='svg')
Out[216]:
Text(0.5, 51.0, 'Predicted label')
In [217]:
cm
Out[217]:
array([[793,   0],
       [  0, 793]])
In [220]:
y_predict = model.predict(testX, batch_size = 32, verbose = 0)
# disp = ConfusionMatrixDisplay.from_predictions(y_true = testy.argmax(axis=1), y_pred = y_predict.argmax(axis=1), normalize='true', 
#                                                values_format='.2%', cmap='Blues', xticks_rotation = 15,
#                                                display_labels=('even', 'incline', 'decline', 'gravelly'))

y_predict = model.predict(testX, batch_size = 32, verbose = 0)
disp = ConfusionMatrixDisplay.from_predictions(y_true = testy.argmax(axis=1), y_pred = y_predict.argmax(axis=1), normalize='true', 
                                               values_format='.2%', cmap='Blues', xticks_rotation = 15,
                                               display_labels=('fast', 'slow'))

plt.savefig('saved_images/220418/fast_slow_confusion_matrix_2class.svg', dpi='figure', format='svg')
In [440]:
print(
    f1_score(testy.argmax(axis=1), y_predict.argmax(axis=1), average='macro'),
    f1_score(testy.argmax(axis=1), y_predict.argmax(axis=1), average='micro'),
    f1_score(testy.argmax(axis=1), y_predict.argmax(axis=1), average='weighted')
     )
1.0 1.0 1.0
In [441]:
pred_to0 = np.zeros(5)
pred_to1 = np.zeros(5)
pred_to2 = np.zeros(5)
pred_to3 = np.zeros(5)
pred_to4 = np.zeros(5)

count0 = 0
count1 = 0
count2 = 0
count3 = 0
count4 = 0

y_predict = model.predict(testX, batch_size = 32, verbose = 0)

for index, val in enumerate(y_predict.argmax(axis=1)):
    if val == 0:
        pred_to0 += y_predict[index]
        count0 += 1
    
    elif val ==1:
        pred_to1 += y_predict[index]
        count1 += 1
    
    elif val ==2:
        pred_to2 += y_predict[index]
        count2 += 1
    
    elif val ==3:
        pred_to3 += y_predict[index]
        count3 += 1
        
    elif val ==4:
        pred_to4 += y_predict[index]
        count4 += 1
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/tmp/ipykernel_1669582/1537825357.py in <module>
     15 for index, val in enumerate(y_predict.argmax(axis=1)):
     16     if val == 0:
---> 17         pred_to0 += y_predict[index]
     18         count0 += 1
     19 

ValueError: operands could not be broadcast together with shapes (5,) (2,) (5,) 
In [ ]:
print(count0, count1, count2, count3, count4)
In [ ]:
cm/793
In [ ]:
print(
    cm[0,0],
    cm[1,1],
    cm[2,2],
    cm[3,3],
    cm[4,4]
)
In [ ]:
y_predict[2]
In [ ]:
pred_to1
In [ ]:
print(np.round(pred_to0/count0*100, 3), '\n', 
      np.round(pred_to1/count1*100, 3), '\n',
      np.round(pred_to2/count2*100, 3), '\n',
      np.round(pred_to3/count3*100, 3), '\n',
      np.round(pred_to4/count4*100, 3), '\n',
     )
In [359]:
fig, loss_ax = plt.subplots()
acc_ax = loss_ax.twinx()

loss_ax.plot(hist.history['loss'], 'y', label='train loss')
loss_ax.plot(hist.history['val_loss'], 'r', label='val loss')
loss_ax.set_xlabel('epoch')
loss_ax.set_ylabel('loss')
loss_ax.legend(loc='lower right')

acc_ax.plot(hist.history['accuracy'], 'b', label='train acc')
acc_ax.plot(hist.history['val_accuracy'], 'g', label='val acc')
acc_ax.set_ylabel('accuracy')
acc_ax.legend(loc='upper right')

plt.savefig('saved_images/220414/acc_loss_trend.svg', dpi='figure', format='svg')
In [443]:
# repeat experiment
repeats = 10
scores = []
for r in range(repeats):
    loss, score, hist = evaluate_model(trainX, trainy, valX, valy, testX, testy)
    score = score * 100.0
    print('>#%d: %.3f' % (r+1, score))
    scores.append(score)
>#1: 100.000
>#2: 100.000
>#3: 100.000
>#4: 100.000
>#5: 100.000
>#6: 100.000
>#7: 100.000
>#8: 100.000
>#9: 100.000
>#10: 100.000
In [341]:
from sklearn.metrics import roc_curve
from sklearn.metrics import auc

# Compute ROC curve and ROC area for each class
n_classes = n_outputs
y_test = testy
y_score = model.predict(testX, batch_size = 5, verbose = 0)
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

# Compute micro-average ROC curve and ROC area
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])

# Plot of a ROC curve for a specific class
plt.figure()
plt.plot(fpr[2], tpr[2], label='ROC curve (area = %0.2f)' % roc_auc[2])
plt.plot([0, 1], [0, 1], 'k--')
plt.xlim([0.0, 0.001])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.savefig('saved_images/220414/ROC_curve_1.svg', dpi='figure', format='svg')

# Plot ROC curve
plt.figure()
plt.plot(fpr["micro"], tpr["micro"],
         label='micro-average ROC curve (area = {0:0.2f})'
               ''.format(roc_auc["micro"]))
for i in range(n_classes):
    plt.plot(fpr[i], tpr[i], label='ROC curve of class {0} (area = {1:0.2f})'
                                   ''.format(i, roc_auc[i]))

plt.plot([0, 1], [0, 1], 'k--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Some extension of Receiver operating characteristic to multi-class')
plt.legend(loc="lower right")
plt.savefig('saved_images/220414/ROC_curve_2.svg', dpi='figure', format='svg')